/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package com.model.service;

import com.model.domain.persona.Encuestador;
import com.model.domain.persona.EstadisticasEncuestador;
import com.model.domain.ubicacion.Conglomerado;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import util.www.jdbc.Select2Jdbc;
import util.www.jdbc.SelectJdbc;
import util.www.jdbc.SeteadorJdbc;
import util.www.sql.WhereSqlCond;


/**
 *
 * @author Rdelacruz
 */
public class EncuestadorService 
extends AbstractService
{
    
    private CargoService cargoService;
    private ConglomeradoService conglomeradoService;
    
    public List<Encuestador> findEncuestadores_codigoNombreCargo(Connection con) throws SQLException { 
        WhereSqlCond w = new WhereSqlCond();
        w.agregarCondicion("cargo='04'");
        return getSelectActivos_codigoNombreCargo(w).getLista(con);
    }
        
    private Select2Jdbc getSelectPosiblesEncuestadoresActivos_codigoNombreCargo(WhereSqlCond w) throws SQLException {
        //coodinadores,supervisores nacionales y departamentes,encuestadores
        w.agregarCondicion("cargo in ('01','02','03','04')");
        return getSelectActivos_codigoNombreCargo(w);
    }
    
    private Select2Jdbc getSelectActivos_codigoNombreCargo(WhereSqlCond where) throws SQLException {
        
        Select2Jdbc select = new Select2Jdbc(Encuestador.class);       
        
        select.setSelect("select P.dni, nombre, apepaterno, apematerno, cargo");
        select.setFrom("from Personal P");        
        where.agregarCondicion("activo=1");
        select.setWhereHaving(where.getAnd());
        select.setOrderby("order by CARGO desc, P.APEPATERNO");
                
        SeteadorJdbc<Encuestador> seteador = new SeteadorJdbc<Encuestador>() {
            @Override
            public void setear(Connection con, ResultSet rs, Encuestador obj) throws SQLException {
                obj.setDni(rs.getString(1));
                
                String s = rs.getString(2);
                obj.setNombres( s!=null ? s.toUpperCase() : null);
               
                s = rs.getString(3);
                obj.setApellidoPaterno(s!=null ? s.toUpperCase() : null);
                
                s = rs.getString(4);
                obj.setApellidoMaterno(s!=null ? s.toUpperCase() : null);
                 
                obj.setCargo(cargoService.findByCodigo(con, rs.getString("cargo")));               
            }
        };        
        select.agregarSeteador(seteador);           
        return select;
    }
            
    
    public List<Encuestador> findByCodigo_codigoNombreCargoNroEntrevistasAnhoPasado(Connection con, String dni) throws SQLException {
        WhereSqlCond w = new WhereSqlCond();
        w.agregarCondicion("P.dni='"+dni+"'");
        return findPosiblesEncuestadoresActivos_codigoNombreCargoNroEntrevistasAnhoPasado(con,w);
    }
        
    public List<Encuestador> findPosiblesEncuestadoresActivos_codigoNombreCargoNroEntrevistasAnhoPasado(Connection con,WhereSqlCond w) throws SQLException {
              
        Select2Jdbc select = this.getSelectPosiblesEncuestadoresActivos_codigoNombreCargo(w);
        //select.setOrderby("order by tieneEntrevistas, CARGO desc, nTotalEntrevistas, P.DNI");
        select.setOrderby("order by tieneEntrevistas, CARGO desc, P.APEPATERNO");
        
        select.setSelect(select.getSelect()+",EE.nEntrevistas,"
                + "ER.nRecuperaciones,"
                + "nTotalEntrevistas = EE.nEntrevistas + ER.nRecuperaciones,"
                +"case when EE.nEntrevistas + ER.nRecuperaciones>0 then 1 else 0 end as tieneEntrevistas"
        );
        
        SeteadorJdbc<Encuestador> seteador = new SeteadorJdbc<Encuestador>() {
            @Override
            public void setear(Connection con, ResultSet rs, Encuestador obj) throws SQLException {
                EstadisticasEncuestador est = new EstadisticasEncuestador();                
                est.setNroEntrevistasRealizadas(rs.getInt("nEntrevistas"));
                est.setNroRecuperacionesRealizadas(rs.getInt("nRecuperaciones"));
                obj.setEstadisticasAnhoPasado(est);
            }
        }; 
        select.agregarSeteador(seteador);
        
String join = "inner join \n" +
"	(select \n" +
"	dni,\n" +
"	count(EE.Conglome) as nEntrevistas\n" +
"	from Personal P\n" +
"	left join Campo_Encuestador_Entrevista EE\n" +
"		on P.DNI = EE.Encuestador_Entrevista	\n" +
"	group by dni) EE\n" +
"	on P.DNI = EE.DNI\n" +
"inner join \n" +
"	(select \n" +
"	dni,\n" +
"	count(ER.Conglome) as nRecuperaciones\n" +
"	from Personal P\n" +
"	left join Campo_Encuestador_Recuperacion ER\n" +
"		on P.DNI = ER.Encuestador_Recuperacion	\n" +
"	group by dni) ER\n" +
"	on P.DNI = ER.DNI";        
        
        select.setJoin(join);
        
        System.out.println("SQL="+select.getSql());
        
        return select.getLista(con);
    }
    
    public void setearSiTrabajoConglomeradoElAnhoPasado(Connection con, List<Encuestador> lista, String codigoConglomerado) throws SQLException {
        for(Encuestador e : lista) {
            setearSiTrabajoConglomeradoElAnhoPasado(con,e,codigoConglomerado);
        }
    }
    
    public void setearSiTrabajoConglomeradoElAnhoPasado(Connection con, Encuestador encuestador, String codigoConglomerado) throws SQLException {
                
        Statement st = null;
        try {                        
            st = con.createStatement();                        
            String sql = "select *\n" +
"from Campo_Encuestador_Entrevista\n" +
"where Conglome='"+codigoConglomerado+"' and Encuestador_Entrevista='"+encuestador.getDni()+"'";
            
            ResultSet rs = st.executeQuery(sql);            
            if(rs.next()) {
                List<Conglomerado> lista = new ArrayList<Conglomerado>();
                Conglomerado c = new Conglomerado();
                lista.add(c);
                encuestador.getEstadisticasAnhoPasado().setConglomeradosEntrevistados(lista);
            }
        }
        finally {
            if(st!=null) st.close();
        }
        
        st = null;
        try {                        
            st = con.createStatement();                        
            String sql = "select *\n" +
"from Campo_Encuestador_Recuperacion\n" +
"where Conglome='"+codigoConglomerado+"' and Encuestador_Recuperacion='"+encuestador.getDni()+"'";
            
            ResultSet rs = st.executeQuery(sql);            
            if(rs.next()) {
                List<Conglomerado> lista = new ArrayList<Conglomerado>();
                Conglomerado c = new Conglomerado();
                lista.add(c);
                encuestador.getEstadisticasAnhoPasado().setConglomeradosRecuperados(lista);
            }
        }
        finally {
            if(st!=null) st.close();
        }
    }
    
            

    public ConglomeradoService getConglomeradoService() {
        return conglomeradoService;
    }

    public void setConglomeradoService(ConglomeradoService conglomeradoService) {
        this.conglomeradoService = conglomeradoService;
    }

    public CargoService getCargoService() {
        return cargoService;
    }

    public void setCargoService(CargoService cargoService) {
        this.cargoService = cargoService;
    }

    

    
    
    
    
}
